package betandregret;

import java.util.Calendar;
import java.util.ListIterator;

public class SpielCollection extends Collection<Spiel>{

	public Spiel findeSpiel(int sid) {
		ListIterator<Spiel> iterator = liste.listIterator();
		while(iterator.hasNext()){
			Spiel currentSpiel= iterator.next();
			if (sid == currentSpiel.getId()){
				return currentSpiel;
			}
		}
		return null;
	}

	public boolean istZeitraumFrei(Calendar startzeit, int dauer) {
		boolean ist_frei = true;
		
		ListIterator<Spiel> iterator = liste.listIterator();
		while(iterator.hasNext()){
			Spiel s = iterator.next();
			
			//berechne Spielende vom neu einzutragenden Spiel
			Calendar spielende = Spiel.getSpielende(startzeit, dauer);
			if(spielende.before(s.getStartzeit())){
				// keine Ueberschneidung mit diesem Spiel, mache mit dem naechsten Spiel weiter
				continue;
			}
			//berechne Spielende vom aktuellen Spiel
			Calendar s_spielende = Spiel.getSpielende(s.getStartzeit(), dauer);	
			if(s_spielende.before(startzeit)){
				// keine Ueberschneidung mit diesem Spiel, mache mit dem naechsten Spiel weiter
				continue;	
			}
			return false;
		}
		return ist_frei;
	}
	
	public String toString(){
		
		Spiel[] sortierteSpiele= new Spiel[liste.size()];
		ListIterator<Spiel> iter1 = liste.listIterator();
		int i=0;
		while(iter1.hasNext()){
			sortierteSpiele[i]=iter1.next();
			i++;
		}
		
		//sortiere Spiele nach Startzeit
		quickSort(sortierteSpiele,0,sortierteSpiele.length-1);
		
		StringBuilder sb = new StringBuilder();
		
		for(int j=0;j<sortierteSpiele.length;j++){
			Spiel spiel = sortierteSpiele[j];
			WetteCollection wetten = spiel.getWetten();
			if(wetten.isEmpty()!=true){
				sb.append( spiel.toString()+'\n'+wetten.toString());				
			}else{
				sb.append( spiel.toString()+'\n');				
			}
		}
		return sb.toString();
	}
	
	/**
	 * Sortiere Spiele-Array per Quicksort nach Startzeit
	 * @param spiele
	 * @param left
	 * @param right
	 */
	 
	private void quickSort(Spiel[] spiele, int left, int right) {
	      int index = partition(spiele, left, right);
	      if (left < index - 1)
	            quickSort(spiele, left, index - 1);
	      if (index < right)
	            quickSort(spiele, index, right);
	}

	private int partition(Spiel[] spiele, int left, int right)
	{
	      int i = left, j = right;
	      Spiel tmp = new Spiel();
	      Calendar pivot = spiele[(left + right) / 2].getStartzeit();
	     
	      while (i <= j) {
	            while (spiele[i].getStartzeit().before(pivot))
	                  i++;
	            while (spiele[j].getStartzeit().after(pivot))
	                  j--;
	            if (i <= j) {
	                  tmp = spiele[i];
	                  spiele[i] = spiele[j];
	                  spiele[j] = tmp;
	                  i++;
	                  j--;
	            }
	      };
	      return i;
	}

}
